/*
 *  Copyright (c) 2001 Sun Microsystems, Inc.  All rights
 *  reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *  1. Redistributions of source code must retain the above copyright
 *  notice, this list of conditions and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in
 *  the documentation and/or other materials provided with the
 *  distribution.
 *
 *  3. The end-user documentation included with the redistribution,
 *  if any, must include the following acknowledgment:
 *  "This product includes software developed by the
 *  Sun Microsystems, Inc. for Project JXTA."
 *  Alternately, this acknowledgment may appear in the software itself,
 *  if and wherever such third-party acknowledgments normally appear.
 *
 *  4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA"
 *  must not be used to endorse or promote products derived from this
 *  software without prior written permission. For written
 *  permission, please contact Project JXTA at http://www.jxta.org.
 *
 *  5. Products derived from this software may not be called "JXTA",
 *  nor may "JXTA" appear in their name, without prior written
 *  permission of Sun.
 *
 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 *  SUCH DAMAGE.
 *  ====================================================================
 *
 *  This software consists of voluntary contributions made by many
 *  individuals on behalf of Project JXTA.  For more
 *  information on Project JXTA, please see
 *  <http://www.jxta.org/>.
 *
 *  This license is based on the BSD license adopted by the Apache Foundation.
 *
 *  $Id: ShareNode.java,v 1.4 2005/05/06 21:44:09 gonzo Exp $
 */

package net.jxta.myjxta.util.objectmodel;

import net.jxta.myjxta.util.Group;
import net.jxta.myjxta.util.Resources;
import net.jxta.myjxta.util.Share;
import net.jxta.share.ContentAdvertisement;

import javax.swing.*;

/**
 * A node describing a shared file
 *
 * @version $Id: ShareNode.java,v 1.4 2005/05/06 21:44:09 gonzo Exp $
 *
 * @author james todd [gonzo at jxta dot org]
 */

public class ShareNode
extends JxtaNode {
    
    /** The category of this node */
    public static final String CATEGORY_SHARE = "share";
    
    /** The share type. This defines the location of the share. */
    private int shareType = 0;
    
    /** Content share originating from this local instance */
    public static final int LOCAL_SHARE = 1;
    /** Content share advertisement originating on a remote peer  */
    public static final int REMOTE_SHARE = 2;
    /** Content share originating on a remote peer AND downloaded to this
     * instance */
    public static final int REMOTE_CACHED_SHARE = 3;
    /** Content share of unknown origin */
    public static final int UNKNOWN_SHARE = 4;
    
    private Share share = null;
    
    public ShareNode(Share share, Group parent, int shareType) {
        super(null, share.getId(), share.getName(), CATEGORY_SHARE);
        
        this.share = share;
        this.shareType = shareType;
        
        setParent(new GroupNode(parent));
    }
    
    public Share getShare() {
        return this.share;
    }
    
    /** Retrieves the share type 
     * @return the share type of this node
     */
    public int getShareType() {
        return this.shareType;
    }
    
    public boolean equals(Object o) {
        return (o instanceof ShareNode &&
            this.share.equals(((ShareNode)o).getShare()));
    }
    
    /**
     * hash method must be over-ridden if equals() is over-ridden.
     * The Object api says that if two objects evaulate as equal using
     * the equals() method, then their hash codes must be equal.
     *
     * This hash method ensures that the hash codes reflect the
     * information evaluated by equals.
     *
     * @return hash code for this GroupNode.
     */
    public int hashCode() {
        return this.share.hashCode();
    }
    
    public int compareTo(Object o) {
        int v = 0;
        
        if (o instanceof ShareNode) {
            v = equals(o) ? 0 : toString().compareToIgnoreCase(o.toString());
        } else {
            v = 1;
        }
        
        return v;
    }
    
    /**
     * Return the image to return for this
     * JxtaNode
     *
     * @param selected is the node currently selected
     * @param expanded is the node currently expanded
     * @param hasFocus has the node currently keyboard focus
     */
    public ImageIcon getImage(boolean selected, boolean expanded,
        boolean hasFocus){
        Resources res = Resources.getInstance();
        // xxx: check for the type of share (local, remote, etc) to assign the
        // xxx: appropriate icon
        return res.getIconResource("TreeTable.Share");
    }
    
    /**
     * Return a descriptive string for the Share described by this node.
     * If available it prints the description, type and length of the file
     * described by this  ShareNode. Otherwise
     * an empty string is displayed
     *
     * @return a description for the group
     */
    public String getDescription(){
        String desc = null;
        
        if (share != null) {
            ContentAdvertisement obj = share.getContentAdvertisement();
            
            if (obj != null) {
                StringBuffer buffer = new StringBuffer();
                
                if (obj.getDescription() != null) {
                    buffer.append(obj.getDescription()).append(" ");
                }
                
                if (obj.getType() != null) {
                    buffer.append(obj.getType()).append(" ");
                }
                
                buffer.append(obj.getLength());
                desc = buffer.toString();
            }
        }
        
        return desc != null ? desc : DESCRIPTION;
    }
}
